// 使数据类型灵活， 而非局限于某一种类型

// 泛型函数

// function hello (arg: number): number {
//   return arg
// }

// function hello (arg: string): string {
//   return arg
// }

// function hello(arg: any): any {
//   return arg
// }

// 声明一个泛型函数hello 传什么就返回什么，传字符串就返回字符串，传数字就返回数字，传123就返回123
function hello<x>(arg: x): x {
  return arg
}
// 调用方式一：尖括号
let output1 = hello<string>('123')
console.log(output1); // '123'
let output2 = hello<number>(123)
console.log(output2); // 123


// 调用方式二：类型推断
let output3 = hello('123')
console.log(output3); // '123'
let output4 = hello(123)
console.log(output4); // 123

// 泛型数组的使用
function fn1<x>(arg: x[]): x[] {
 console.log(arg[0], arg.length) // '1234' 2
 return arg
}
let output5 = fn1(['1234', 'abc'])
function fn2<x>(arg: Array<x>): Array<x> {
  const str: string = <any>arg[0]
  console.log(str.split('')); // ["1", "2", "3", "4"]
  return arg
}
let output6 = fn2<string>(['1234', '5678'])
